package common.util;

import java.util.HashMap;

import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;

/**
 * 効果音をする
 */
public class SoundPoolHelper {
    private static SoundPoolHelper sManager;
    private SoundPool mSoundPool;
    private HashMap<String, Integer> mSoundIdMap;
    private HashMap<Integer, Boolean> mLoadedMap;
    private Context mContext;

    /**
     * インスタンスを生成する
     * 
     * @param context
     * @return インスタンス
     */
    public static SoundPoolHelper getInstance(Context context, int poolSize) {
        if (sManager == null) {
            sManager = new SoundPoolHelper(context);
        }
        return sManager;
    }

    private SoundPoolHelper(Context context) {
        mContext = context;
        mSoundPool = new SoundPool(5, AudioManager.STREAM_NOTIFICATION, 0);
        mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int id, int status) {
                if (status == 0) {
                    mLoadedMap.put(id, true);
                }
            }
        });
        mSoundIdMap = new HashMap<String, Integer>();
        mLoadedMap = new HashMap<Integer, Boolean>();
    }

    /**
     * サウンドを登録する
     * 
     * @param key サウンドキー
     * @param resId サウンドID
     */
    public void addSound(String key, int resId) {
        int id = mSoundPool.load(mContext, resId, 1);
        mLoadedMap.put(id, false);
        mSoundIdMap.put(key, id);
    }

    /**
     * サウンドを再生する
     * 
     * @param key サウンドキー
     */
    public void play(String key) {
        stopAll();
        int id = mSoundIdMap.get(key);
        if (mLoadedMap.get(id)) {
            mSoundPool.play(id, 1, 1, 1, 0, 1);
        }
    }

    /**
     * サウンドを停止する
     * 
     * @param key サウンドキー
     */
    private void stop(String key) {
        int id = mSoundIdMap.get(key);
        if (mLoadedMap.get(id)) {
            mSoundPool.stop(id);
        }
    }

    /**
     * すべてのサウンドを停止する
     */
    private void stopAll() {
        for (String key : mSoundIdMap.keySet()) {
            stop(key);
        }
    }
}
